package com.ruoyi.web.controller.business;

import com.ruoyi.business.domain.dto.DeviceDTO;
import com.ruoyi.business.service.FeignService;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.entity.SysUser;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.List;

/**
 * Feign调用示例控制器
 * 
 * 使用说明：
 * 1. 本控制器演示如何在业务代码中使用Feign服务
 * 2. 所有接口都是示例，可以根据实际需求修改
 * 3. 异常处理由FeignErrorDecoder和全局异常处理器负责
 */
@RestController
@RequestMapping("/feign/demo")
public class FeignDemoController extends BaseController {

    @Resource
    private FeignService feignService;

    /**
     * 示例1: 获取设备列表
     * 
     * 接口说明：
     * 1. 调用冰狐平台获取设备列表
     * 2. 可选参数onlineState用于过滤设备在线状态
     * 3. 在线状态：0-离线，1-在线，2-在线但服务不可用
     * 
     * 请求示例：
     * GET /feign/demo/devices?onlineState=1
     *
     * @param onlineState 在线状态（可选）
     * @return 设备列表
     */
    @GetMapping("/devices")
    public R<List<DeviceDTO>> getDevices(@RequestParam(required = false) String onlineState) {
        List<DeviceDTO> devices = feignService.getDeviceList(onlineState);
        return R.ok(devices);
    }

    /**
     * 示例2: 获取当前用户信息
     * 
     * 接口说明：
     * 1. 调用系统服务获取当前登录用户信息
     * 2. 需要用户已登录，否则会返回错误
     * 
     * 请求示例：
     * GET /feign/demo/user
     *
     * @return 用户信息
     */
    @GetMapping("/user")
    public R<SysUser> getCurrentUser() {
        SysUser user = feignService.getSysUserByRpc();
        return R.ok(user);
    }

    /**
     * 示例3: 调用冰狐微服务
     * 
     * 接口说明：
     * 1. 调用冰狐平台上的微服务
     * 2. 需要提供微服务名称、环境和参数
     * 3. 参数需要URL编码
     * 
     * 请求示例：
     * GET /feign/demo/call?name=testService&isDev=true&param=key1%3Dvalue1%26key2%3Dvalue2
     *
     * @param name  服务名称
     * @param isDev 是否开发环境
     * @param param 参数（URL编码）
     * @return 调用结果
     */
    @GetMapping("/call")
    public R<String> callMicroService(
            @RequestParam String name,
            @RequestParam(defaultValue = "false") Boolean isDev,
            @RequestParam String param) {
        String result = feignService.callMicroService(name, isDev, param);
        return R.ok(result);
    }
} 